package com.coolingme.annotation;

import com.coolingme.domain.Person;

import java.lang.annotation.Annotation;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * 利用反射获取注解的返回对象
 *
 * @author wangyue
 * @date 2019/3/17 18:25
 */
public class MyAnnotationTest {

    public static void main(String[] args) {
        MyAnnotationTest myAnnotationTest = new MyAnnotationTest();
        myAnnotationTest.annotationOnConstructor();
    }

    /**
     * 获取属性上的注解的返回值
     */
    public void annotationOnField() {
        try {
            //解析Person类中，属性上的注解，需要用到反射技术
            //1、获取clazz
//            Class clazz = Class.forName("com.dylan.domain.Person");
            Class clazz = Person.class;
            //2、通过clazz获取私有属性
            Field field = clazz.getDeclaredField("name");
            System.out.println(field.getType());
            //3、通过field获取属性上的注解
            //属性对象.getAnnotation(注解类.class)
            Annotation annotation = field.getAnnotation(MyAnnotation.class);
            //4、获取注解类的clazz
            Class annotationClazz = annotation.getClass();
            System.out.println(annotationClazz.getSimpleName());
            //5、通过annotationClazz获取方法
//            Method annotationMethod = annotationClazz.getMethod("value");
//            System.out.println(annotationMethod.getName());
//            //6、通过annotationMethod调用方法，获取返回值
//            String[] values = (String[]) annotationMethod.invoke(annotationClazz);
//            for (String value : values) {
//                System.out.println(value);
//            }

            //普通写法，没有使用反射技术
            //4、通过annotation执行注解类中的方法,获取其返回值
            String[] values = ((MyAnnotation) annotation).value();

            System.out.println(values[0]);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取构造函数上的注解的返回值
     */
    public void annotationOnConstructor() {
        try {
            Class clazz = Class.forName("com.coolingme.domain.Person");
            Constructor constructor = clazz.getConstructor();
            Annotation annotation = constructor.getAnnotation(MyAnnotation.class);
            Class annotationClazz = annotation.getClass();
            Method annotationMethod = annotationClazz.getMethod("value");
            String[] values = (String[]) annotationMethod.invoke(annotation);
            for (String value : values) {
                System.out.println(value);
            }


        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
